package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"strings"
	"time"

	"soffice/config"
	"soffice/controller"
	"soffice/docs"
	"soffice/storage"

	"github.com/gin-gonic/gin"
	"github.com/joho/godotenv"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

// 配置
const (
	Port = ":18420"
)

// 获取环境变量或使用默认值
func getBaseURL() string {
	if baseURL := os.Getenv("BASE_URL"); baseURL != "" {
		return baseURL
	}
	return "http://localhost:18420"
}

// 从baseURL提取host部分
func getHostFromBaseURL(baseURL string) string {
	// 移除协议部分
	host := strings.TrimPrefix(baseURL, "http://")
	host = strings.TrimPrefix(host, "https://")
	return host
}

// 确保目录存在
func ensureDirExists(dirPath string) error {
	if _, err := os.Stat(dirPath); os.IsNotExist(err) {
		return os.MkdirAll(dirPath, 0755)
	}
	return nil
}

// 设置静态文件缓存头
func setCacheHeaders(apiBasePath string) gin.HandlerFunc {
	return func(c *gin.Context) {
		staticPath := "/" + apiBasePath + "/static/"
		if strings.HasPrefix(c.Request.URL.Path, staticPath) {
			c.Header("Cache-Control", "public, max-age=31536000, immutable")
			c.Header("Expires", time.Now().AddDate(1, 0, 0).UTC().Format(http.TimeFormat))
		}
		c.Next()
	}
}

// @title 文件转HTML API
// @version 1.0
// @description 将Office文档转换为HTML格式的API服务
// @BasePath /document-to-html
func main() {
	// 加载 .env 文件
	if err := godotenv.Load(); err != nil {
		log.Printf("警告: 未找到 .env 文件，将使用系统环境变量: %v", err)
	}

	// 初始化存储
	if err := storage.InitStorage(); err != nil {
		log.Fatalf("初始化存储失败: %v", err)
	}

	storageType := os.Getenv("STORAGE_TYPE")
	if storageType == "" {
		storageType = "local"
	}
	log.Printf("使用存储类型: %s", storageType)

	// 动态设置 Swagger host（通过baseURL获取）
	baseURL := getBaseURL()
	swaggerHost := getHostFromBaseURL(baseURL)
	docs.SwaggerInfo.Host = swaggerHost

	// 创建必要的目录（仅本地存储需要）
	dirs := []string{"uploads", "out", "static", "static/images"}
	for _, dir := range dirs {
		if err := ensureDirExists(dir); err != nil {
			log.Fatalf("创建目录失败 %s: %v", dir, err)
		}
	}

	// 获取API基础路径
	apiBasePath := config.GetAPIBasePath()
	log.Printf("API基础路径: /%s", apiBasePath)

	// 动态设置 Swagger BasePath
	docs.SwaggerInfo.BasePath = "/" + apiBasePath

	// 创建Gin路由器
	r := gin.Default()

	// 添加缓存中间件
	r.Use(setCacheHeaders(apiBasePath))

	// 配置静态文件服务
	r.Static("/"+apiBasePath+"/static", "./static")

	// API路由
	controller.RegisterRoutes(r, apiBasePath)

	// Swagger文档路由
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// 根路径重定向到API文档
	r.GET("/", func(c *gin.Context) {
		c.Redirect(http.StatusMovedPermanently, "/swagger/index.html")
	})

	// 启动服务器
	fmt.Printf("服务器运行在 %s\n", baseURL)
	fmt.Printf("API文档地址: %s/swagger/index.html\n", baseURL)
	fmt.Printf("支持的文件格式: pdf, doc, docx, odt, odp, pptx, ppt, ods, xlsx, xls\n")

	if err := r.Run(Port); err != nil {
		log.Fatalf("启动服务器失败: %v", err)
	}
}
